package org.example.vue3tsbackend.common;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@NoArgsConstructor
@AllArgsConstructor
public class RestResult<T> {

    /**
     * 结果代码，请求执行成功
     */
    public static final int CODE_OK = 200;
    /**
     * 结果代码，系统内部错误
     */
    public static final int CODE_INTERNAL_ERROR = 1001;
    /**
     * 结果代码，数据已存在错误
     */
    public static final int CODE_EXISTS = 1020;
    /**
     * 结果代码，数据未找到错误
     */
    public static final int CODE_NOT_FOUND = 1021;
    /**
     * 结果代码，数据无权限
     */
    public static final int CODE_NO_PERM = 403;

    private String message;
    private int code;
    private T data;
    private String status;

    /**
     * 构造结果对象
     * @param status 处理的结果状态，成功传入{@link Status#SUCCESS}，失败传入{@link Status#ERROR}
     * @param code 处理的结果代码
     * @param message 处理的结果信息
     * @see #CODE_OK
     * @see #CODE_NOT_FOUND
     * @see #CODE_EXISTS
     * @see #CODE_INTERNAL_ERROR
     */
    public RestResult(String status, int code, String message) {
        this.status = status;
        this.code = code;
        this.message = message;
    }

    /**
     * 构造处理成功的结果对象
     * @param <T> 结果数据的类型
     * @return
     */
    public static <T> RestResult<T> ok() {
        return new RestResult<T>(Status.SUCCESS, RestResult.CODE_OK, "操作成功");
    }

    /**
     * 构造处理成功的结果对象
     * @param <T> 结果数据的类型
     * @param data 结果数据
     * @return
     */
    public static <T> RestResult<T> ok(T data) {
        return new RestResult<T>(Status.SUCCESS, RestResult.CODE_OK, "操作成功").data(data);
    }

    /**
     * 构造处理失败的结果对象
     * @param <T> 结果数据的类型
     * @return
     */
    public static <T> RestResult<T> err() {
        return new RestResult<T>(Status.ERROR, RestResult.CODE_OK, "操作失败");
    }

    /**
     * 构造处理失败的结果对象
     * @param <T> 结果数据的类型
     * @return
     */
    public static <T> RestResult<T> err(String message) {
        return new RestResult<T>(Status.ERROR, RestResult.CODE_OK, message);
    }

    /**
     * 构造发生数据已存在错误类型失败的结果对象
     * @param <T> 结果数据的类型
     * @return
     */
    public static <T> RestResult<T> existsErr() {
        return new RestResult<T>(Status.ERROR, RestResult.CODE_EXISTS, "数据已存在");
    }

    /**
     * 构造发生数据无权限的结果对象
     * @param <T> 结果数据的类型
     * @return
     */
    public static <T> RestResult<T> permErr() {
        return new RestResult<T>(Status.ERROR, RestResult.CODE_NO_PERM, "数据无权限");
    }

    /**
     * 构造发生数据不存在错误类型失败的结果对象
     * @param <T> 结果数据的类型
     * @return
     */
    public static <T> RestResult<T> notFoundErr() {
        return new RestResult<T>(Status.ERROR, RestResult.CODE_NOT_FOUND, "数据不存在");
    }

    /**
     * 构造发生系统内部错误类型失败的结果对象
     * @param <T> 结果数据的类型
     * @return
     */
    public static <T> RestResult<T> sysErr() {
        return new RestResult<T>(Status.ERROR, RestResult.CODE_INTERNAL_ERROR, "系统内部错误");
    }

    /**
     * 构造发生系统内部错误类型失败的结果对象
     * @param <T> 结果数据的类型
     * @return
     */
    public static <T> RestResult<T> sysErr(T data) {
        return new RestResult<T>(Status.ERROR, RestResult.CODE_INTERNAL_ERROR, "系统内部错误").data(data);
    }

    /**
     * 构造发生不支持的请求方式错误类型失败的结果对象
     * @param <T> 结果数据的类型
     * @return
     */
    public static <T> RestResult<T> reqErr() {
        return new RestResult<T>(Status.ERROR, 1004, "不支持的请求方式");
    }

    /**
     * 设置处理的结果数据
     * @param object 结果数据
     * @return
     */
    public RestResult<T> data(T object) {
        this.data = object;
        return this;
    }

    /**
     * 设置处理的结果信息
     * @param message 结果信息
     * @return
     */
    public RestResult<T> msg(String message) {
        this.message = message;
        return this;
    }

    /**
     * 设置处理的结果信息
     * @param format 结果信息的格式，信息的格式化通过{@link String#format(String, Object...)}完成
     * @param messages 信息格式化时所需要的数据
     * @return
     */
    public RestResult<T> msg(String format, Object... messages) {
        this.message = String.format(format, messages);
        return this;
    }

    /**
     * 设置处理的结果代码
     * @param code 结果代码
     * @return
     */
    public RestResult<T> code(int code) {
        this.code = code;
        return this;
    }


    /**
     * 返回请求的处理结果代码
     *
     * @return
     * @see #CODE_OK
     * @see #CODE_NOT_FOUND
     * @see #CODE_EXISTS
     * @see #CODE_INTERNAL_ERROR
     */
    public int getCode() {
        return code;
    }

    /**
     * 设置请求的处理结果代码
     *
     * @param code 处理结果代码
     * @see #CODE_OK
     * @see #CODE_NOT_FOUND
     * @see #CODE_EXISTS
     * @see #CODE_INTERNAL_ERROR
     */
    public void setCode(int code) {
        this.code = code;
    }

    /**
     * 返回处理的状态，成功返回{@link Status#SUCCESS}，失败返回{@link Status#ERROR}
     *
     * @return
     */
    public String getStatus() {
        return status;
    }

    /**
     * 设置处理的状态，成功为{@link Status#SUCCESS}，失败为{@link Status#ERROR}
     * @param status 处理状态
     *
     */
    public void setStatus(String status) {
        this.status = status;
    }

    /**
     * 返回处理的结果信息
     * @return
     */
    public String getMessage() {
        return message;
    }

    /**
     * 设置处理的结果信息
     * @param message 处理结果信息
     */
    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * 处理返回的结果数据
     * @return
     */
    public T getData() {
        return data;
    }

    /**
     * 设置处理的结果数据
     * @param data 处理结果数据
     */
    public void setData(T data) {
        this.data = data;
    }

    /**
     * 处理状态
     *
     */
    public static class Status {

        /**
         * 处理成功
         */
        public static final String SUCCESS = "success";

        /**
         * 处理失败
         */
        public static final String ERROR = "error";
    }
}
